﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Data;
using System.Configuration;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Collections;
using System.Xml.Linq;
using System.IO;
using System.Text.RegularExpressions;

namespace CityGames
{
    public partial class PaginaJuego : System.Web.UI.Page
    {
        static private Socio socio = new Socio();
        static private Juego juego = new Juego();
        static private Empleado empleado = new Empleado();
        static private Valoracion enValoracion = new Valoracion();
        static private Comentario comentario = new Comentario();
        static private CopiaFisica copiaFisica = new CopiaFisica();
        static private CarroSocio carroSocio = new CarroSocio();
        static private Promocion promocion = new Promocion();
        private const int RATING1_MIN = 1;
        private const int RATING1_MAX = 10;
        private string nombreJuego;
        private string plataformaJuego;

        /************************************************** Funciones de Marcos **************************************************/

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                nombreJuego = Request.QueryString["juego"];
                plataformaJuego = Request.QueryString["plataforma"];

                if (nombreJuego != null && plataformaJuego != null)
                {
                    if (juego.ExisteJuego(nombreJuego, plataformaJuego))
                    {
                        
                        if (!IsPostBack)
                        {
                            tbComentario.Attributes.Add("maxlength", "500");
                            tbComentario.Attributes.Add("onKeyUp", "escribirCaracteresRestantes()");

                            juego.RellenarDatosDeJuego(nombreJuego, plataformaJuego);

                            lbNombre.Text = juego.Nombre;
                            lbPlataforma.Text = juego.Plataforma;
                            lbGenero.Text = juego.Genero;

                            if (juego.PrecioNuevo != "")
                            {
                                lbPrecioNuevo.Text = juego.PrecioNuevo + " €";
                                btAddNuevo.Visible = true;
                            }
                            else
                            {
                                lbPrecioNuevo.Text = "Sin precio.";
                                btAddNuevo.Visible = false;
                            }

                            if (juego.PrecioSegundaMano != "")
                            {
                                lbPrecioSegundaMano.Text = juego.PrecioSegundaMano + " €";
                                btAddSegundaMano.Visible = true;
                            }
                            else
                            {
                                lbPrecioSegundaMano.Text = "Sin precio.";
                                btAddSegundaMano.Visible = false;
                            }

                            string[] promociones = promocion.GetTipoPromocion(nombreJuego, plataformaJuego);

                            switch (promociones[0])
                            {
                                case null:
                                    lbPromocion.Text = "Ninguna";
                                    break;
                                case "Ninguna":
                                    lbPromocion.Text = "Ninguna";
                                    break;
                                case "2X1":
                                    lbPromocion.Text = promociones[0];
                                    break;
                                default:
                                    lbPromocion.Text = promociones[0] + " " + promociones[1];
                                    break;
                            }

                            imgCaratula.ImageUrl = ConvertirDireccionImagen(juego.Caratula);
                            linkCaratula.Attributes.Add("href", ConvertirDireccionImagen(juego.Caratula));
                            linkCaratula.Attributes.Add("rel", "lightbox");

                            lbValoracionCityGames.Text = juego.Puntuacion;

                            lbSinopsis.Text = juego.Sinopsis;
                        }
                    }
                    else
                    {
                        // Redireccionar (no existe el juego introducido en la URL)
                        Response.Redirect("Home.aspx");
                    }
                }
                else
                {
                    // Redireccionar (no ha introducido un juego en la URL)
                    Response.Redirect("Home.aspx");
                }
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }
        }

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);

            try
            {
                // Despues de haber ejecutado el codigo de los botones, limpiamos el tbComentario
                tbComentario.Text = "";
                lblCaracteresRestantes.Text = (tbComentario.MaxLength - tbComentario.Text.Length).ToString();

                //************** IMAGENES Y COMENTARIOS **************

                DataSet ds = comentario.ObtenerComentariosDeJuego(nombreJuego, plataformaJuego);
                DataSet dsImagenes = juego.ObtenerImagenesDeJuego(nombreJuego, plataformaJuego);

                listViewComentarios.DataSource = ds.Tables[0];
                listViewComentarios.DataBind();

                listViewImagenes.DataSource = dsImagenes.Tables[0];
                listViewImagenes.DataBind();

                if (ds.Tables[0].Rows.Count > 0)
                {
                    lbSinComentarios.Visible = false;
                    lbPagina.Visible = true;
                }
                else
                {
                    lbSinComentarios.Visible = true;
                    lbPagina.Visible = false;
                }

                if (dsImagenes.Tables[0].Rows.Count > 0)
                {
                    lbPaginaSiguienteImagenes.Visible = true;
                    lbSinImagenes.Visible = false;
                }
                else
                {
                    lbPaginaSiguienteImagenes.Visible = false;
                    lbSinImagenes.Visible = true;
                }

                //************** FIN IMAGENES Y COMENTARIOS **************

                // Si es administrador ocultamos los paneles para valorar y comentar el juego y mostramos el de subir imagen
                if (Session["usuario"] != null)
                {
                    if (empleado.EsAdministrador(Session["usuario"].ToString()))
                    {
                        panelValorar.Visible = false;
                        panelDejarComentario.Visible = false;
                        panelSubirImagenes.Visible = true;
                        panelBotonBorrar.Visible = true;
                        panelBotonBorrarComentario.Visible = false;

                        CheckBox cb = null;
                        foreach (ListViewDataItem item in listViewImagenes.Items)
                        {
                            cb = (CheckBox)(item.FindControl("checkboxImagenSeleccionada"));
                            cb.Visible = true;
                        }

                        foreach (ListViewDataItem item in listViewComentarios.Items)
                        {
                            cb = (CheckBox)(item.FindControl("checkBoxComentario"));
                            cb.Visible = false;
                        }
                    }
                    else if (empleado.EsModerador(Session["usuario"].ToString()))
                    {
                        panelValorar.Visible = false;
                        panelDejarComentario.Visible = false;
                        panelSubirImagenes.Visible = false;
                        panelBotonBorrar.Visible = false;
                        panelBotonBorrarComentario.Visible = true;

                        CheckBox cb = null;
                        foreach (ListViewDataItem item in listViewImagenes.Items)
                        {
                            cb = (CheckBox)(item.FindControl("checkboxImagenSeleccionada"));
                            cb.Visible = false;
                        }

                        foreach (ListViewDataItem item in listViewComentarios.Items)
                        {
                            cb = (CheckBox)(item.FindControl("checkBoxComentario"));
                            cb.Visible = true;
                        }
                    }
                    else
                    {
                        panelValorar.Visible = true;
                        panelDejarComentario.Visible = true;
                        panelSubirImagenes.Visible = false;
                        panelBotonBorrar.Visible = false;
                        panelBotonBorrarComentario.Visible = false;

                        CheckBox cb = null;
                        foreach (ListViewDataItem item in listViewImagenes.Items)
                        {
                            cb = (CheckBox)(item.FindControl("checkboxImagenSeleccionada"));
                            cb.Visible = false;
                        }

                        foreach (ListViewDataItem item in listViewComentarios.Items)
                        {
                            cb = (CheckBox)(item.FindControl("checkBoxComentario"));
                            cb.Visible = false;
                        }
                    }
                }
                else
                {
                    panelValorar.Visible = true;
                    panelDejarComentario.Visible = true;
                    panelSubirImagenes.Visible = false;
                    panelBotonBorrar.Visible = false;
                    panelBotonBorrarComentario.Visible = false;

                    CheckBox cb = null;
                    foreach (ListViewDataItem item in listViewImagenes.Items)
                    {
                        cb = (CheckBox)(item.FindControl("checkboxImagenSeleccionada"));
                        cb.Visible = false;
                    }

                    foreach (ListViewDataItem item in listViewComentarios.Items)
                    {
                        cb = (CheckBox)(item.FindControl("checkBoxComentario"));
                        cb.Visible = false;
                    }
                }

                //************** VALORACIONES USUARIOS **************

                int votos = enValoracion.ObtenerNumeroDeValoraciones(nombreJuego, plataformaJuego);

                if (votos == 1)
                    lbVotosUsuarios.Text = votos.ToString() + " voto.";
                else
                    lbVotosUsuarios.Text = votos.ToString() + " votos.";

                lbPuntuacionUsuarios.Text = enValoracion.ObtenerValoracionMediaUsuarios(nombreJuego, plataformaJuego).ToString("0.#");

                if (Session["usuario"] == null)
                {
                    // ********** Valoraciones **********
                    lbValorar.Text = "Debes estar registrado para valorar el juego";
                    lbValorar.Font.Bold = true;
                    Rating1.Visible = false;
                    labelCaption1.Visible = false;
                    labelValue1.Visible = false;
                    btValorar.Visible = false;

                    // ********** Comentarios **********
                    panelDejarComentario.Enabled = false;
                    tbComentario_TextBoxWatermarkExtender.WatermarkText = "Debes estar registrado para dejar comentarios";
                }
                else
                {
                    //********** Valoraciones **********
                    lbValorar.Font.Bold = false;
                    Rating1.Visible = true;
                    labelCaption1.Visible = true;
                    labelValue1.Visible = true;

                    int valoracion = enValoracion.ObtenerValoracionDeSocio(Session["usuario"].ToString(), nombreJuego, plataformaJuego);

                    if (valoracion == 0)
                    {

                        if (Session["valorar"] == null)
                        {
                            Session["valorar"] = "valorando";
                            lbValorar.Text = "Valorar juego:";
                            labelValue1.Text = "5";
                            Rating1.CurrentRating = 5;
                            panelValorar.Enabled = true;
                            Rating1.ReadOnly = false;
                            btValorar.Visible = true;
                        }
                    }
                    else
                    {
                        lbValorar.Text = "Ya has valorado este juego:";
                        labelValue1.Text = valoracion.ToString();
                        Rating1.CurrentRating = valoracion;
                        panelValorar.Enabled = false;
                        Rating1.ReadOnly = true;
                        btValorar.Visible = false;
                    }

                    //********** Comentarios **********
                    panelDejarComentario.Enabled = true;
                    tbComentario_TextBoxWatermarkExtender.WatermarkText = "Escribe aquí tu comentario";
                }

                //************** FIN VALORACIONES USUARIOS **************
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }
        }


        protected void btEnviar_Click(object sender, EventArgs e)
        {
            try
            {
                comentario.Dni = Session["usuario"].ToString();
                comentario.Juego = nombreJuego;
                comentario.Plataforma = plataformaJuego;
                comentario.ComentarioUsuario = tbComentario.Text;
                comentario.FechaPublicacion = DateTime.Now;

                comentario.InsertarComentario();
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }
        }

        // *************** FUNCIONES PARA LA VALORACION ***************

        protected void Rating1_Changed(object sender, AjaxControlToolkit.RatingEventArgs e)
        {
            Evaluate_Rating(int.Parse(e.Value));
        }

        public void Evaluate_Rating(int value)
        {
            labelValue1.Text = EvaluateRating(value, Rating1.MaxRating, RATING1_MIN, RATING1_MAX);
        }

        public static string EvaluateRating(int value, int maximalValue, int minimumRange, int maximumRange)
        {
            int stepDelta = (minimumRange == 0) ? 1 : 0;
            double delta = (double)(maximumRange - minimumRange) / (maximalValue - 1);
            double result = delta * value - delta * stepDelta;
            return FormatResult(result);
        }

        public static string FormatResult(double value)
        {
            return String.Format("{0:g}", value);
        }

        // *************** FIN FUNCIONES PARA LA VALORACION ***************

        private string ConvertirDireccionImagen(string imagen)
        {
            string resultado = @"Caratulas/";

            try
            {
                if (imagen != "")
                {
                    string[] campos = imagen.Split('\\');
                    resultado += campos[campos.Length - 1];
                }
                else
                    resultado += "caratula_no_disponible.gif";
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }

            return resultado;
        }

        protected void btValorar_Click(object sender, EventArgs e)
        {
            try
            {
                if (Session["usuario"] != null && nombreJuego != "" && plataformaJuego != "")
                {
                    enValoracion.Juego = nombreJuego;
                    enValoracion.Plataforma = plataformaJuego;
                    enValoracion.Dni = Session["usuario"].ToString();
                    enValoracion.Puntuacion = Rating1.CurrentRating;

                    enValoracion.InsertarValoracion();
                }
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }
        }

        // *************** FUNCIONES PARA SUBIR ARCHIVOS ***************

        protected void btnUpload_Click(object sender, EventArgs e)
        {
            try
            {
                HttpFileCollection filecolln = Request.Files;
                if (filecolln.Count > 0)
                {
                    for (int i = 0; i < filecolln.Count; i++)
                    {
                        HttpPostedFile file = filecolln[i];
                        if (file.ContentLength > 0)
                        {
                            string savepath = "";
                            string tempPath = "";
                            tempPath = System.Configuration.ConfigurationManager.AppSettings["FilePath"];
                            savepath = Server.MapPath(tempPath);
                            string filename = file.FileName;

                            if (!Directory.Exists(savepath))
                                Directory.CreateDirectory(savepath);

                            file.SaveAs(savepath + @"\" + filename);
                            Response.StatusCode = 200;

                            juego.InsertarImagenDeJuego(nombreJuego, plataformaJuego, filename);
                        }
                    }
                    MyMessageBoxInfo.Show(MyMessageBox.MessageType.Success, "Imagenes cargadas con éxito.", "Carga completada", 115, 400);
                }
                else
                {
                    MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Debe seleccionar al menos un archivo.", "ERROR", 115, 400);
                }

            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }
        }

        // *************** FIN FUNCIONES PARA SUBIR ARCHIVOS ***************

        public string ConvertToHTML(string entrada)
        {
            string resultado = "";

            try
            {
                for (int i = 0; i < entrada.Length; i++)
                    if (entrada[i] == '\n')
                        resultado += "<br />";
                    else
                        resultado += entrada[i];
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }

            return resultado;
        }

        public string ObtenerNombreJuego()
        {
            return nombreJuego + " para " + plataformaJuego;
        }

        protected void btBorrarImagenes_Click(object sender, EventArgs e)
        {
            CheckBox cb = null;

            try
            {
                foreach (ListViewDataItem item in listViewImagenes.Items)
                {
                    cb = (CheckBox)(item.FindControl("checkboxImagenSeleccionada"));
                    if (cb.Checked)
                        juego.BorrarImagenDeJuego(cb.Text);
                }
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }
        }

        protected void btBorrarComentarios_Click(object sender, EventArgs e)
        {
            CheckBox cb = null;
            HiddenField hf = null;

            try
            {
                foreach (ListViewItem item in listViewComentarios.Items)
                {
                    cb = (CheckBox)(item.FindControl("checkBoxComentario"));
                    if (cb.Checked)
                    {
                        hf = (HiddenField)(item.FindControl("hiddenFieldComentarioID"));
                        comentario.BorrarComentarioDeJuego(int.Parse(hf.Value.ToString()));
                    }
                }
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }
        }

        protected void btAddSegundaMano_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                int ult_num = 0;

                if (!JuegoAñadido(nombreJuego, plataformaJuego, "segunda"))                                    //COMPRUEBA SI EL JUEGO NO ESTÁ YA EN EL CARRITO DE LA COMPRA
                {                                                       //SI NO ESTA AÑADIDO LO AÑADE
                    if (Session["numeroJuegos"] != null)
                        ult_num = (int)(Session["numeroJuegos"]);

                    Session["juego" + (ult_num + 1)] = nombreJuego;
                    Session["plataforma" + (ult_num + 1)] = plataformaJuego;
                    Session["cantidad" + (ult_num + 1)] = "1";
                    Session["tipo" + (ult_num + 1)] = "segunda";

                    Session["numeroJuegos"] = ult_num + 1;

                    if (Session["usuario"] != null)
                        carroSocio.InsertarJuego(Session["usuario"].ToString(), nombreJuego, plataformaJuego, "segunda", "1");

                }
                else
                {
                    AñadirCopias(nombreJuego, plataformaJuego, "segunda", "1");
                }
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }
        }

        protected void btAddNuevo_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                int ult_num = 0;

                if (!JuegoAñadido(nombreJuego, plataformaJuego, "nuevo"))                                    //COMPRUEBA SI EL JUEGO NO ESTÁ YA EN EL CARRITO DE LA COMPRA
                {                                                       //SI NO ESTA AÑADIDO LO AÑADE
                    if (Session["numeroJuegos"] != null)
                        ult_num = (int)(Session["numeroJuegos"]);

                    Session["juego" + (ult_num + 1)] = nombreJuego;
                    Session["plataforma" + (ult_num + 1)] = plataformaJuego;
                    Session["cantidad" + (ult_num + 1)] = "1";
                    Session["tipo" + (ult_num + 1)] = "nuevo";

                    Session["numeroJuegos"] = ult_num + 1;

                    if (Session["usuario"] != null)
                        carroSocio.InsertarJuego(Session["usuario"].ToString(), nombreJuego, plataformaJuego, "nuevo", "1");
                }
                else
                {
                    AñadirCopias(nombreJuego, plataformaJuego, "nuevo", "1");
                }
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }
        }

        /************************************************** Fin Funciones de Marcos **************************************************/

        /************************************************** Funciones de Ruben **************************************************/

        private bool JuegoAñadido(string nombre, string plataforma, string tipo)
        {
            bool ok = false;
            int num = 0;

            try
            {
                if (Session["numeroJuegos"] != null)
                    num = (int)(Session["numeroJuegos"]);

                for (int i = 1; i <= num && !ok; i++)
                {
                    if ((Session["juego" + i.ToString()]).ToString() == nombre && (Session["plataforma" + i.ToString()]).ToString() == plataforma && (Session["tipo" + i.ToString()]).ToString() == tipo)
                    {
                        ok = true;
                    }
                }
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }

            return ok;
        }

        private bool AñadirCopias(string nombre, string plataforma, string tipo, string cantidad)
        {
            bool ok = false;
            int num = 0;
            int numeroCopias = 0;

            try
            {
                if (Session["numeroJuegos"] != null)
                    num = (int)(Session["numeroJuegos"]);

                for (int i = 1; i <= num && !ok; i++)
                {
                    if ((Session["juego" + i.ToString()]).ToString() == nombre && (Session["plataforma" + i.ToString()]).ToString() == plataforma && (Session["tipo" + i.ToString()]).ToString() == tipo)
                    {
                        if (tipo == "nuevo")                                             //SI EL JUEGO ES NUEVO
                        {
                            numeroCopias = copiaFisica.NumeroCopiasFisicasNuevas(nombre, plataforma);

                        }
                        else if (tipo == "segunda")                                     //SI EL JUEGO ES DE SEGUNDA MANO
                        {
                            numeroCopias = copiaFisica.NumeroCopiasFisicasSegundaMano(nombre, plataforma);
                        }

                        if (int.Parse(Session["cantidad" + i.ToString()].ToString()) + int.Parse(cantidad) > numeroCopias)
                        {
                            Session["cantidad" + i.ToString()] = numeroCopias.ToString();
                            if (Session["usuario"] != null)
                                carroSocio.ModificarCantidad(Session["usuario"].ToString(), nombre, plataforma, tipo, numeroCopias.ToString());
                        }
                        else
                        {
                            Session["cantidad" + i.ToString()] = int.Parse(Session["cantidad" + i.ToString()].ToString()) + int.Parse(cantidad);
                            if (Session["usuario"] != null)
                                carroSocio.ModificarCantidad(Session["usuario"].ToString(), nombre, plataforma, tipo, (int.Parse(Session["cantidad" + i.ToString()].ToString()) + int.Parse(cantidad)).ToString());
                        }
                        ok = true;
                    }
                }
            }
            catch
            {
                MyMessageBoxInfo.Show(MyMessageBox.MessageType.Error, "Ha ocurrido un error. Disculpen las molestias", "ERROR", 200, 300);
            }

            return ok;
        }

        /************************************************** Fin Funciones de Ruben **************************************************/
    }
}